/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */
package jp.ize.ux.acts;

// {{{ imports
import jp.ize.ux.UXObject;
import jp.ize.ux.acts.Act;
// }}}
// {{{ enum SelectActEvent {
enum SelectActEvent {
	SELECT( target : UXObject );   /* 選択をした */
	DESELECT( target : UXObject ); /* 非選択をした */
}
// }}}
// {{{ class SelectAct extends Act
/**
 * SelectAct クラス<br>
 * 子コンポーネントの選択される動作を実現するアクションです。<br>
 *
 * @author		iZE Co., Ltd.<br>
 * @version		$Id$<br>
 */
class SelectAct extends Act
{
	// {{{ properties

	public var sa : UXObject -> Void;
	public var da : UXObject -> Void;
	public var exclusive : Bool;
	public var iterp : ListStateType -> Int;

	// }}}
	// {{{ public function new( exclusive : Bool, select : UXObject -> Void, deselect : UXObject -> Void )
	/**
	 * コンストラクタです。
	 * 排他的選択かどうか、選択された効果、選択されていない状態に戻す効果をパラメーターに取ります。
	 */
	public function new( exclusive : Bool, select : UXObject -> Void, deselect : UXObject -> Void )
	{
		super();
		this.exclusive = exclusive;
		this.sa = select;
		this.da = deselect;
	}
	// }}}
	// {{{ public function select( interp:ListStateType->Int ) : ListStateType -> Void
	/**
	 * 状態やイベントからどの子コンポーネントが対象なのかを判断する関数を引数に取り、選択状態の効果と状態の変更を行います。
	 */
	public function select( interp:ListStateType->Int ) : ListStateType -> Void
	{
		var me = this;
		return function( state : ListStateType ) : Void {
			var index = interp(state);
			for ( i in 0...state.children.length ) {
				var c = state.children[i];
				if ( me.exclusive ) {
					if ( i==index ) {
						if ( !c.selected ) {
							c.selected = true;
							me.sa( c );
						}
					} else {
						c.selected = false;
						me.da( c );
					}
				} else {
					if ( i==index ) {
						if ( c.selected ) {
							c.selected = false;
							me.da( c );
						} else {
							c.selected = true;
							me.sa( c );
						}
					} else {
					}
				}
			}
			if ( state.subject!=null ) {
				state.subject.notify(Act.STOP);
			}
		};
	}
	// }}}
}
// }}}
